/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package visual.Configuracion;

/**
 *
 * @author giulio
 */
        import bentity.beEntrada;
import bentity.beUsuario;
        import blogic.blAlmacen;
        import blogic.blHelper;
import blogic.blLog;
        import java.awt.Color;
	import java.awt.Graphics;
	import java.awt.Point;
        import java.awt.event.WindowEvent;
        import java.awt.event.WindowListener;
        import java.awt.image.BufferStrategy;
	import java.io.BufferedReader;
	import java.io.DataInputStream;
	import java.io.FileInputStream;
	import java.io.InputStreamReader;
        import java.sql.SQLException;
	import java.util.ArrayList;
	import java.util.Random;
        import java.util.logging.Level;
        import java.util.logging.Logger;
	import javax.swing.JFrame;
        import javax.swing.JLabel;
        import javax.swing.JOptionPane;
        import javax.swing.JScrollBar;
        import javax.swing.JScrollPane;
        import javax.swing.Popup;
        import javax.swing.ScrollPaneConstants;
        import javax.swing.border.Border;
        import visual.Seguridad.visualHelper;

	public class dlgMapaCreado extends javax.swing.JDialog{
	    private static final int TAM_UNIT = 10;
	    private int racksCol = 0;
	    private int racksFila = 0;
	    private int tamRack = 0;
            private boolean esPrimeraVez=false;
            private boolean pintaEnt=false;
            private Point puntoCentrado= new Point();

            //NO BORREN
            //fila=y-(y/3)-1 ... / es division entera...iterar hasta el x para pintar todo el rack
            //nroubicacion=x-(x/8)-1 iterar hasta el x para pintar todo el rack
            //nroubicaciondentrodelrack=nroubicacion mod 7
            //nrorack=nroubicacion/7

	    private Point entrada = new Point(-1,-1);
	    private ArrayList pedidos = new ArrayList<Point>();
	    private char[][] matriz;
            private boolean eligio_entrada=false;
            private BufferStrategy bfs=null;
            private ArrayList entradas=new ArrayList<beEntrada>();
            private beUsuario usuario;

            public dlgMapaCreado(pnfDistribucionAlmacen parent, boolean b, beUsuario usu) {
                super((java.awt.Frame)null,b);
                racksCol=parent.getRaCol();
                racksFila=parent.getrFila();
                tamRack=parent.getUxr();
                usuario=usu;
                blAlmacen bla= new blAlmacen();
                try {
                    entradas = bla.buscarObjsEntrada();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                    visualHelper.mostrarMensajeError("Ocurrió un error durante el procesamiento");
                }
                initComponents();
                this.setModal(true);
                visualHelper.centrarDialogoEnPantalla(this);
                blHelper blh = new blHelper();
                puntoCentrado=visualHelper.centrarDibujo(this.getSize(), blh.calcularNumeroColumnas(racksFila, tamRack),blh.calcularNumeroFilas(racksCol) , TAM_UNIT);
                this.repaint();
            }

	    private void initComponents() {
		this.setLayout(null);
		this.setBounds(100, 100, 800, 600);
//                JScrollBar barV= new JScrollBar(JScrollBar.VERTICAL);
//                JScrollBar barH= new JScrollBar(JScrollBar.HORIZONTAL);
                JLabel lblTitulo = new javax.swing.JLabel();
                lblTitulo.setFont(new java.awt.Font("Dialog", 0, 36));
                lblTitulo.setText("Almacén generado");
                add(lblTitulo);
//                this.getContentPane().add(barV, BorderLayout.EAST);
//                this.getContentPane().add(barH, BorderLayout.SOUTH);

                //JScrollPane scrp=new JScrollPane(this,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
                //add(scrp);

                lblTitulo.setBounds(170, 20, 445, 43);
		this.leerArchivo();
                this.setAlwaysOnTop(true);

                addMouseListener(new java.awt.event.MouseAdapter() {
                    public void mouseClicked(java.awt.event.MouseEvent evt) {
                try {
                    formMouseClicked(evt);
                } catch (Exception ex) {
                    visualHelper.mostrarMensajeError("Ocurrió un error durante el procesamiento");
                }
            }
        });
                addMouseMotionListener(new java.awt.event.MouseAdapter() {
                    public void mouseMoved(java.awt.event.MouseEvent evt){
                        formMouseMoved(evt);
                    }
                });

                this.addWindowListener(new WindowListener() {

            public void windowOpened(WindowEvent e) {
                repaint();
            }

            public void windowClosing(WindowEvent e) {

            }

            public void windowClosed(WindowEvent e) {

            }

            public void windowIconified(WindowEvent e) {
            }

            public void windowDeiconified(WindowEvent e) {
            }

            public void windowActivated(WindowEvent e) {
                repaint();
            }

            public void windowDeactivated(WindowEvent e) {
            }
        });
		
	    }

	    private void leerArchivo() {
		try {
		    leeDatos();
		}
		catch (Exception ex) {
		    System.out.println("Ocurrió un error");
		}
	    }

	    private void leeDatos() throws Exception{

                blHelper blh = new blHelper();

		int numCol = blh.calcularNumeroColumnas(racksFila, tamRack);
		int numFil = blh.calcularNumeroFilas(racksCol);

                matriz =blh.llenarMatrizEntradas(entradas, numCol, numFil, tamRack);
                this.imprimirMatriz();
	    }

            private void imprimirMatriz(){
                blHelper blh = new blHelper();
                int numCol = blh.calcularNumeroColumnas(racksFila, tamRack);
		int numFil = blh.calcularNumeroFilas(racksCol);

                for(int i=0; i<numFil; i++){
		    for(int j=0; j<numCol; j++)
		        System.out.print(""+matriz[j][i]);
		    System.out.println("");
		}
            }

	    private Point getNuevoPunto(int rInt) {
		int grupoRack = rInt / (tamRack*2);
		int filaRack = grupoRack / racksFila;
		return null;
	    }

            private void formMouseClicked(java.awt.event.MouseEvent evt) throws Exception {
          
                int corX=evt.getX();
                int corY=evt.getY();
                blHelper blh = new blHelper();
                int numCol = blh.calcularNumeroColumnas(racksFila, tamRack);
		int numFil = blh.calcularNumeroFilas(racksCol);

                if(corX>=puntoCentrado.x &&corX<(puntoCentrado.x+(numCol*TAM_UNIT)) && corY>=puntoCentrado.y && corY<puntoCentrado.y +(numFil*TAM_UNIT)){

                    if((corX>=puntoCentrado.x && corX<puntoCentrado.x+TAM_UNIT)||((corY>=puntoCentrado.y) && (corY<puntoCentrado.y+TAM_UNIT))||
                        ((corX>=puntoCentrado.x+(numCol*TAM_UNIT)-TAM_UNIT) && (corX<puntoCentrado.x+(numCol*TAM_UNIT)))||
                        ((corY>=puntoCentrado.y+(numFil*TAM_UNIT)-TAM_UNIT) && (corY<puntoCentrado.y+(numFil*TAM_UNIT)))){

                        entrada.x=(corX-puntoCentrado.x)/TAM_UNIT;
                        entrada.y=(corY-puntoCentrado.y)/TAM_UNIT;

                        if(!(entrada.x==0 && entrada.y==0) &&!(entrada.x==numCol-1 && entrada.y==0)
                                &&!(entrada.x==0 && entrada.y==numFil-1)&&!(entrada.x==numCol-1 && entrada.y==numFil-1)){

                            repaint();
                            int res=visualHelper.mostrarPreguntaSiNo("Desea confirmar esta ubicación como entrada del almacén");
                            if (res==JOptionPane.YES_OPTION) {
                                String rot=JOptionPane.showInputDialog(null, "Ingrese el rótulo para la entrada", "Confirmación",JOptionPane.INFORMATION_MESSAGE);
                                if (rot!=null){
                                    this.eligio_entrada=true;
                                    repaint();
                                    blAlmacen bla = new blAlmacen();
                                    beEntrada beE=new beEntrada();
                                    beE.setPos_x(entrada.x);
                                    beE.setPos_y(entrada.y);
                                    beE.setRotulo(rot);
                                    try {
                                        bla.registraEntrada(beE);
                                        (new blLog()).registrarLog(usuario.getIdUsuario(), this.usuario.getCargo(), "Se registró la entrada "+rot);
                                        //crear entrada y asignarla al almacén, y cerrar el dialogo, agregando al combo la entrada creada, y modificando la matriz
                                        } catch (SQLException ex) {
                                            ex.printStackTrace();
                                            visualHelper.mostrarMensajeError("Ocurrió un error durante el procesamiento");
                                        }
                                            this.dispose();
                                }
                            }
                        }
                    }
                }
           }

            private void formMouseMoved(java.awt.event.MouseEvent evt) {

                int corX=evt.getX();
                int corY=evt.getY();

                blHelper blh = new blHelper();
                int numCol = blh.calcularNumeroColumnas(racksFila, tamRack);
		int numFil = blh.calcularNumeroFilas(racksCol);

                if(corX>=puntoCentrado.x &&corX<(puntoCentrado.x+(numCol*TAM_UNIT)) && corY>=puntoCentrado.y && corY<puntoCentrado.y+(numFil*TAM_UNIT)&&!eligio_entrada){

                    if((corX>=puntoCentrado.x && corX<(puntoCentrado.x+TAM_UNIT))||((corY>=puntoCentrado.y) && (corY<(puntoCentrado.y+TAM_UNIT)))||
                        ((corX>=puntoCentrado.x+(numCol*TAM_UNIT)-TAM_UNIT) && (corX<puntoCentrado.x+(numCol*TAM_UNIT)))||
                        ((corY>=puntoCentrado.y+(numFil*TAM_UNIT)-TAM_UNIT) && (corY<puntoCentrado.y+(numFil*TAM_UNIT)))){

                        entrada.x=(corX-puntoCentrado.x)/TAM_UNIT;
                        entrada.y=(corY-puntoCentrado.y)/TAM_UNIT;
                        pintaEnt=true;
                        repaint();
                        //System.out.println(this.getNumCol() + " "+this.getNumFil()+" "+corX+" "+ corY);
                    }
                }
            }

	    @Override
	    public void paint(Graphics g){
                if (!this.esPrimeraVez){
                    this.esPrimeraVez=true;
                    this.createBufferStrategy(2);
                    bfs =this.getBufferStrategy();
                }

                if (getBfs()!=null){
                    Graphics g1=getBfs().getDrawGraphics();
                    super.paint(g1);
                    visualHelper.pintarAlmacenConEntradas(g1,entradas, racksCol, racksFila, tamRack, TAM_UNIT, this.getSize(), Color.GREEN);
                    visualHelper.pintarRotulosPasillosRacksFilas(g1, racksCol, racksFila, tamRack, this.TAM_UNIT, this.getSize());
                    if(pintaEnt){
                        pintarEntrada(g1);
                    }
                    visualHelper.pintarMalla(g1, racksCol, racksFila, tamRack, TAM_UNIT,  this.getSize());
                    getBfs().show();
                }
	    }

	    private void pintarEntrada(Graphics g) {
                
                if(entrada.x!=-1 && entrada.y!=-1){
                    g.setColor(Color.CYAN);
                    g.fillRect(puntoCentrado.x+entrada.x*this.TAM_UNIT, puntoCentrado.y+entrada.y*this.TAM_UNIT, this.TAM_UNIT, this.TAM_UNIT);
                    pintaEnt=false;
                }
		
	    }

	    private int getNumFil(){
		return racksCol*3+3;
	    }

	    private int getNumCol(){
		return racksFila*tamRack+racksFila+3;
	    }

	    private int getNumTotalUbicaciones(){
		return racksFila*racksCol*tamRack;
	    }

    /**
     * @return the bfs
     */
    public BufferStrategy getBfs() {
        return bfs;
    }

    /**
     * @param bfs the bfs to set
     */
    public void setBfs(BufferStrategy bfs) {
        this.bfs = bfs;
    }
	}